package com.example.Controller;

import com.alibaba.fastjson.JSON;
import com.example.constant.UserStatus;
import com.example.constant.UserStatus1;
import com.example.constant.UserStatus2;
import com.example.eo.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 调用事件发布者
 */
@RestController
@RequiredArgsConstructor
@Api(tags={"UserController"})
public class UserController {

    /** http://127.0.0.1:8000/test/testEnum   {"status":0}
     * 可以发现正常映射
     * {
     *     "status": {
     *         "value": 0,
     *         "desc": "禁用",
     *         "ordinal":0
     *     },
     *     "status1": null
     * }
     * @param userStatus
     * @return
     */
    @RequestMapping(value = "/test/testEnum" )
    @ApiOperation("testEnum")
    public User testEnum(@RequestBody User userStatus){
        String jsonString = JSON.toJSONString(userStatus);
        System.out.println(jsonString);
        return userStatus;
    }

    /** http://127.0.0.1:8000/test/testEnum1   {"status1":1}
     *  发现返回的数据value变成了4
     *  {
     *     "status": null,
     *     "status1": {
     *         "value": 4,
     *         "desc": "启用"
     *     }
     * }
     * 说明依靠MVC的自动封装进行的，使用的是枚举类的ordinal，不可控，或者说需要依赖人工校验枚举类的属性值。
     * 本人觉得此方式不可取，因为总会有疏忽的地方，或者枚举值起始值较大时，如10，100，1000时，就无法使用此方式了
     * @param userStatus
     * @return
     */
    @RequestMapping(value = "/test/testEnum1" )
    public User testEnum1(@RequestBody User userStatus){
        return userStatus;
    }


    /** 自定义conventor  UserStatusConverter,只能处理get请求
     *  http://127.0.0.1:8000/test/testEnum2?status=3
     *  返回的数据
     *  {
     *     "value": 3,
     *     "desc": "禁用"
     * }
     *
     * @param status
     * @return
     */
    @RequestMapping(value = "/test/testEnum2" )
    public UserStatus1 testEnum2( UserStatus1 status){
        return status;
    }

    /** 自定义JsonDeserializer  UserStatusEnumDeserializer,处理json类型
     * http://127.0.0.1:8000/test/testEnum3    {"status1":3}
     * 返回格式
     * {
     *     "status": null,
     *     "status1": {
     *         "value": 3,
     *         "desc": "禁用"
     *     }
     * }
     *
     * @param userStatus
     * @return
     */
    @RequestMapping(value = "/test/testEnum3" )
    public User testEnum3(@RequestBody User userStatus){
        return userStatus;
    }

    /** 自定义JsonDeserializer  UserStatusEnumSerializer,处理json类型
     * http://127.0.0.1:8000/test/testEnum4?status2=3
     * 返回格式
     * {
     *     "status": null,
     *     "status1": {
     *         "value": 3,
     *         "desc": "禁用"
     *     }
     * }
     *
     * @param userStatus
     * @return
     */
    @RequestMapping(value = "/test/testEnum4" )
    public User testEnum4(@RequestBody User userStatus){
        return userStatus;
    }
}
